home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 105_01 / lib.c < prev    next >
Text File  |  1984-06-03  |  17KB  |  660 lines

  1. /*addmoney will add dollars and cents which are presented in an array
  2. which is 6 unsigned integers. The first integer is the dollars of the 
  3. first number, the second integer the cents of the first number, the 
  4. third integer the dollars of the second number, and the fourth integer 
  5. the cents of the second number. The answer, which properly checks for
  6. overflow of the cents, has the dollars in the fifth integer and cents in 
  7. the sixth integer. This routine will only add money, it will not subtract!
  8. The maximum value permitted in the answer (and obviously in either of the
  9. values is $65535.99. There are no error checks. */
  10.  
  11. addmoney(money)
  12. unsigned money[];
  13. {
  14.     money[4] = money[0] + money[2];
  15.     money[5] = money[1] + money[3];
  16.     if (money[5] > 99)
  17.     {
  18.         money[5] -= 100;
  19.         money[4]++;
  20.     }
  21.     return;    
  22. }
  23.  
  24. /* chkdate will check an ASCII string to see if it is a proper date. A 
  25. ptoper date is one which has a number of 1 to 31 followed by a correct 
  26. 3-letter code. If an improper date is found, chkdate returns -1; else
  27. it returns the day of year where JAN 1 is a 1 and every month has 31
  28. days. */
  29.  
  30. chkdate(dd)
  31. char dd[];
  32. {
  33.     int i,j,k;
  34.     char dt[36];
  35.  
  36.     k = atoi(dd);
  37.     if (k < 1 || k > 31)
  38.         return(-1);
  39.     i = 0;
  40.     while(isdigit(dd[i++]));
  41.     for (j=0,i--;j<3;j++,i++)
  42.         dd[i] = toupper(dd[i]);
  43.     i -=3;
  44.     movmem("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",dt,36);
  45.     for(j = 0; j < 36; j+=3)
  46.         if(dt[j]==dd[i]&&dt[j+1]==dd[i+1]&&dt[j+2]==dd[i+2])
  47.             return(((j/3)*31) + k);
  48.     return(-1);
  49. }
  50.  
  51. /*comma checks a buffer (resbuf) at an index (j) for the nth comma (nbr).
  52. If it encounters an end-of-line(CR) or slash it returns a -1. Else it
  53. returns the index to the first character after the comma.*/
  54.  
  55. comma(resbuf,j,nbr)
  56. char resbuf[];
  57. int j;
  58. int nbr;
  59. {
  60.     int i;
  61.     for (i = 0; i < nbr; i++)
  62.     {
  63.         while (resbuf[j] != ',')
  64.         {
  65.             if (resbuf[j] == 13 || resbuf[j] == 92)
  66.                 return(-1);
  67.             j++;
  68.         }
  69.         j++;
  70.     }
  71.     return(j);
  72. }
  73. /*count counts the number of characters in the buffer (resbuf) from the 
  74. index (j) up to either the first comma,first slash, first end-of-line (CR),
  75. or end of buffer (control Z). It does not count blanks in the total. The 
  76. total number of characters is returned as an integer.*/
  77.  
  78. count(resbuf,j)
  79. char resbuf[];
  80. int j;
  81. {
  82.     int i;
  83.     for(i=0;resbuf[j]!=','&&resbuf[j]>26&&resbuf[j]!=92;j++) 
  84.     if(resbuf[j] != ' ')
  85.         i++;
  86.     return(i);
  87. }
  88.  
  89. /*count1 counts the number of characters in the buffer (resbuf) from the
  90. index (j) up to either the first comma,first slash, first end-of-line (CR),
  91. or end of buffer (control Z). It counts blanks in the total. The total number 
  92. of characters is returned as an integer. */
  93.  
  94. count1(resbuf,j)
  95. char resbuf[];
  96. int j;
  97. {
  98.     int i;
  99.     for (i=0;resbuf[j]!=','&&resbuf[j]>26&&resbuf[j]!=92;i++,j++);
  100.     return(i);
  101. }
  102.  
  103. /*error will print the alarm in the array (ss) and then hang until any 
  104. character is typed on the console. there are no error conditions or exit
  105. parameters*/
  106.  
  107. error(ss)
  108. char ss[];
  109. {
  110.  
  111.     printf("%s",ss);
  112.     bdos(1);
  113. }
  114.  
  115. /*findline will look for the first line of the buffer (resbuf) starting at the 
  116. index (j) which has a first character match with the character in flag. Since 
  117. findline first looks for the beginning of the nextline it is necessary to have
  118. a special case for j in order to get the very first line. Therefore if j is
  119. negative then the first character of the first line is also checked. If a match
  120. is found then the index to the character which matches is returned, else a -1
  121. is returned indicating no match found.*/
  122.  
  123. findline(resbuf,j,flag)
  124. char resbuf[];
  125. int j;
  126. char flag;
  127. {
  128.     if(j < 0)
  129.         if(resbuf[0] == flag)
  130.             return(0);
  131.     while((j = nextline(resbuf,j)) != -1)
  132.         if (toupper(resbuf[j]) == flag)
  133.             return(j);
  134.     return(j);
  135. }
  136.  
  137. /*getal is a special function used to retrieve airline information from
  138. the airline file. It matches the two characters in al against the first 2 
  139. characters of 32 byte groupings in the airline file. If it finds a match
  140. it returns the 32 byte array in buf1 and a exit parameter of zero. If it
  141. cannot find a match it returns -1.*/
  142.  
  143. getal(al,buf1,fd)
  144. char al[];
  145. char buf1[];
  146. int fd;
  147. {
  148.     int i,j;
  149.     for (i=0;;i++)
  150.     {
  151.         rwblk(fd,buf1,0,1,i);
  152.         for(j=0;j<128;j+=32)
  153.         {
  154.             if((buf1[j] =='Z')&&(buf1[j+1]=='Z'))
  155.                 return(-1);
  156.             if((buf1[j]==al[0])&&(buf1[j+1]==al[1]))
  157.             {
  158.                 for (i=0;i<32;i++,j++)
  159.                     buf1[i] = buf1[j];
  160.                 return(0);
  161.             }
  162.         }
  163.     }
  164. }
  165.  
  166. /*getcit is a special routine which matches a set of 3-byte city codes (plus
  167. a string-ending zero) against a file on disk. The city codes are in the 
  168. array city, and the number of entries is in count. The disk file has a 
  169. 16-byte array for each city which is moved into buf2. If all the cities 
  170. are found then a zero is returned, else a -1 is returned*/
  171.  
  172. getcit(city,buf1,buf2,count,fd)
  173. char city[];
  174. char buf1[];
  175. char buf2[];
  176. int count;
  177. int fd;
  178. {
  179.     int i,j,k,m,n;
  180.     n = 0;
  181.     for (i=0;;i++)
  182.     {    
  183.         rwblk(fd,buf1,0,1,i);
  184.         for(j=0;j<128;j+=16)
  185.         {
  186.             for (k=0;city[k] != 26;k+=4)
  187.             {
  188.                 if(stgcmp("ZZZ",&buf1[j],3))
  189.                     return(-1);
  190.                 if(stgcmp(&city[k],&buf1[j],3))
  191.                 {    
  192.                          movmem(&buf1[j],&buf2[k * 4],16);
  193.                     n++;   
  194.                     if(n==count)       
  195.                         return(0);
  196.                 }
  197.             }
  198.         }
  199.     }
  200. }
  201.  
  202. /*getdate will retrieve the date from the MPM function TOD and tranlate it 
  203. into a set of ASCII characters in the array date. It checks to see if the 
  204. TOD function has ever been run and if not prints an alarm to the operator
  205. and exits back to MPM. Else it returns the month as 2 digits followed by
  206. the day as 2 digits, followed by the last 2 digits of year. getdate does
  207. proper checks for leap year and different size months.*/
  208.  
  209. getdate(date)
  210. char date[];
  211. {
  212. int temp[3];
  213. int day_tab[2][13];
  214. int i,j,k;
  215. int leap;
  216. int year;
  217. int yearday;
  218. int month;
  219. int day;
  220.  
  221. bdos (155,temp);
  222. if(temp[0] == 761)
  223. {
  224.     printf("No TOD entered \n");
  225.     exit(0);
  226. }
  227. for (yearday = temp[0],year = 2;;)
  228. {
  229. if ((yearday - 365) < 0)
  230.     break;
  231. yearday -= 365;
  232. year++;
  233. if ((yearday - 365) < 0)
  234.     break;
  235. yearday -=365;
  236. year++;
  237. if ((yearday - 366) < 0)
  238.     break;
  239. yearday -=366;
  240. year++;
  241. if ((yearday - 365) < 0)
  242.     break;
  243. yearday -=365;
  244. year++;
  245. }
  246. initw(day_tab,"0,31,28,31,30,31,30,31,31,30,31,30,31");
  247. initw(&day_tab[1][0],"0,31,29,31,30,31,30,31,31,30,31,30,31");
  248. leap = year%4 == 0;
  249. for (i = 1;yearday > day_tab[leap][i];i++)
  250.     yearday -= day_tab[leap][i];
  251. itoa2(i,&date[0]);
  252. itoa2(yearday,&date[2]);
  253. year += 76;
  254. itoa2(year,&date[4]);
  255. return;
  256. }
  257. /*itoa2 is a little function used by getdate to convert an integer which must
  258. be between 0 and 99 to 2 ASCII characters*/
  259.  
  260. itoa2(n,s)
  261. char s[2];
  262. int n;
  263. {
  264. s[0] = n/10 + '0';
  265. s[1] = n%10 + '0';
  266. }
  267.  
  268. /*getfare is a specialized function used for computing base airline fares
  269. from gross fares. It receives dollars and cents as 2 integers and divides 
  270. them by the fraction represented by DIVA and DIVB (currently 1.05). The
  271. answer is output as ASCII characters in the array out1 with 4 digits of
  272. dollars,a decimal point and 2 digits of cents. Leading zeroes are turned 
  273. into blanks.*/
  274.  
  275. #define DIVA 1050
  276. #define DIVB 105
  277. getfare(dollars,cents,out1)
  278. int dollars;
  279. int cents;
  280. char out1[];
  281. {
  282.     int i;
  283.     int out[7];
  284.     for(i=0;i<7;i++)
  285.     {
  286.         out[i] = dollars/DIVA;
  287.         dollars = dollars%DIVA;
  288.         dollars = dollars*10;
  289.     }
  290.     for (i=4;i<7;i++)
  291.     {
  292.         cents = cents*10;
  293.         out[i] = out[i] + (cents/DIVB);
  294.         cents = cents%DIVB;
  295.     }
  296.     out[6] += 5;
  297.     for(i=6;i>=0;i--)
  298.         if(out[i] > 9)
  299.         {
  300.             out[i] -= 10;
  301.             out[i-1]++;
  302.         }
  303.  
  304.     for(i=0;out[i] == 0;i++)
  305.         out[i] +=47;
  306.     for(i=0;i<6;i++)
  307.         out1[i] = out[i] + 48;
  308.     out1[6] = out1[5];
  309.     out1[5] = out1[4];
  310.     out1[4] = '.';
  311. }
  312.  
  313. /*getsec will get a sector or group of sectors from the file represented 
  314. by fdd. The file must previously have been opened and it must have been
  315. initialized such that the number of sectors in the file are represented 
  316. by a single bit in the first 4 sectors of the file. Since the bit map 
  317. for allocation is already allocated itself the first 4 bits must be set 
  318. to 1 for this scheme to work. The function assumes that the file i